package com.zw.transition.common;

import lombok.Data;

/**
 * @Description: json 返回结果封装， 用于 ajax 请求返回的结果包装
 *
 * @Author: China.sgl
 * @Date: 2020/7/30 9:42
 */
@Data
public class JsonResult {

    private ResultType type;
    private String msg;
    private Object data;

    /**
     * 无参构造
     */
    public JsonResult() {
    }

    /**
     * 全参构造
     *
     * @param type 结果类型
     * @param msg  结果消息描述
     * @param data 结果数据
     */
    public JsonResult(ResultType type, String msg, Object data) {
        this.type = type;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 返回成功结果
     *
     * @param msg  消息
     * @param data 数据
     * @return 成功结果
     */
    public static JsonResult success(String msg, Object data) {
        return new JsonResult(ResultType.SUCCESS, msg, data);
    }

    /**
     * 返回成功结果
     *
     * @param msg 消息
     * @return 成功结果
     */
    public static JsonResult success(String msg) {
        return success(msg, null);
    }

    /**
     * 返回成功结果
     * @return 成功结果
     */
    public static JsonResult success() {
        return success("操作成功");
    }

    /**
     * 返回错误结果
     *
     * @param msg 消息
     * @return 错误
     */
    public static JsonResult fail(String msg) {
        return new JsonResult(ResultType.ERROR, msg, null);
    }

    /**
     * 返回错误结果
     * @return 错误
     */
    public static JsonResult fail() {
        return fail("操作失败");
    }

    /**
     * 根据数据库操作影响行数返回结果
     *
     * @param row 影响行数
     * @return 结果
     */
    public static JsonResult rowNumber(int row) {
        return row > 0 ? success() : fail();
    }

    /**
     * 根据布尔值返回相应结果
     *
     * @param b 布尔值
     * @return 结果
     */
    public static JsonResult is(boolean b) {
        return b ? success() : fail();
    }

    /**
     * 根据对象为空状态返回结果， 如果为空返回成功，否则返回错误
     *
     * @param o 对象
     * @return 结果
     */
    public static JsonResult isNull(Object o) {
        return o == null ? success() : fail();
    }

    /**
     * 根据对象为空状态返回结果， 如果非空返回成功，否则返回错误
     *
     * @param o 对象
     * @return 结果
     */
    public static JsonResult isNotNull(Object o) {
        return o != null ? success() : fail();
    }

    /**
     * setter
     *
     * @param data data
     * @return this
     */
    public JsonResult setData(Object data) {
        this.data = data;
        return this;
    }

    public enum ResultType {

        /** 成功, 错误 */
        SUCCESS(200), ERROR(500);

        private final int code;

        ResultType(int code) {
            this.code = code;
        }

        public int getCode() {
            return code;
        }
    }

}
